1 Pendahuluan

Halaman ini merupakan catatan penelitian tentang keberadaan ruang publik di balik sebuah tagar yang digunakan di media sosial. Keberadaan ruang publik di sini diidentifikasi melalui tiga dimensi ruang publik, yaitu: (1) dimensi struktural; (2) dimensi representasional; dan (3) dimensi interaksional. Identifikasi terhadap tiga dimensi tersebut dibagi menjadi di folder. Bagian ini akan berusahan mengidentifikasi, menjelaskan, dan memaknai berbagai aktivitas warga net di Twitter terkait dengan keberadaan tagar #jogjaoradidol di twitter. Berikut adalah pertanyaan yang mencoba dijawab:

Bagaimana keterlibatan masyarakat dalam penggunaan tagar #jogjaoradidol di Twitter?

Untuk menjawab pertanyaan tersebut, tiga indikator dimensi struktural ruang publik, yaitu: (1) inklusif ada kesempatan yang sama untuk terlibat dalam diskuis; (2) bebas dari kepentingan kekuasaan dan ekonomi; dan (3) memungkinkan terbentuknya opini publik.

Pembahasan dibagi menjadi beberapa bagian. Pertama, membahas berbagai aktivitas warga net di dalam Twitter. Kedua, membahas berbagai kejadian di dunia nyata yang melatari penggunaan tagar. Ketiga, membahas makna keberadaan tagar sebagai sebuah ruang yang dapat dijadikan tempat untuk mendiskusikan kebijakan.

2 Persiapan

2.1 R Library

library(lubridate)
library(tidyverse)
library(tidytext)
library(stringr)
library(lubridate)
library(tm)
library(reshape2)
library(scales)
library(AnomalyDetection)
library(anomalize)

Di sini saya akan terlebih dahulu mempersiapkan file yang ingin dianalisis. Persiapan meliputi membuat semua variable dalam format yang tepat, hingga menambah variabel baru berdasarkan data yang ada.

Variabel yang ingin ditambahkan adalah: 1. Identitas logical twit sebagai duplicate atau bukan 2. Username dan count username 3. Membagi data menjadi beberapa kluster berdasarkan tanggal posting 4. Menambah kolom untuk teks yang sudah dibersihkan 5. Menambah kolom jumlah term per row dari teks yang sudah diberishkan 6. Mengekstrak tagar tiap row 7. Menghitung jumlah tagar per baris.

Saat ini, data sudah memiliki 10 kolom, oleh dengan rencana diatas maka data akan memiliki 17 kolom.

# import data
raw_jod <- read.csv("hasil-new1.csv", stringsAsFactors = FALSE, header = FALSE, sep = ",")
nama_kolom1 <- c("date", "time", "username", "tweets", "replying", "rep_count", "ret_count", "fav_count", "link")
colnames(raw_jod) <- nama_kolom1

# transform date format
raw_jod$date <- as.Date(raw_jod$date, format = "%Y/%m/%d")

#raw_jod$time <- hms(raw_jod$time, roll = FALSE, quiet = FALSE)
# tranform NA to 0 in fav_count, rep_count, and ret_count
raw_jod$ret_count <- as.integer(raw_jod$ret_count)
raw_jod <- tidyr::replace_na(raw_jod, list(fav_count=0, rep_count=0, ret_count=0))

2.2 Duplicate or Not

raw_jod <- raw_jod %>%
  dplyr::mutate(is_duplicate = duplicated(tweets))
jod_dup <- raw_jod %>%
  filter(is_duplicate == TRUE)
jod_no_dup <- raw_jod %>%
  filter(is_duplicate == FALSE)

Jumlah total twit = 13493

Jumlah twit yang memiliki duplicte = 866

Jumlah twit yang tidak memiliki duplicte = 12627

2.3 Pembagian periode

Untuk melihat perkembangan penggunaan tagar, twit dibagi menjadi beberapa periode berdasarkan tahapan perkembangan sebuah gerakan sosial. Salah satu referensi dapat dilihat di sini.

  1. Fase Emergence: 2013-10-07 sampai 2013-12-31
  2. Fase Coalescence: 2014-01-01 sampai 2014-06-30
  3. Fase Bureaucratization: 2014-07-01 sampai 2014-12-31
  4. Fase Decline: 2015-01-01 sampai 2017-08-30
fase1 <- raw_jod %>% 
  subset(date >= "2013-10-07" & date <= "2013-12-31" ) %>%
  mutate(fase = "1_Emergence")

fase2 <- raw_jod %>% 
  subset(date >= "2014-01-01" & date <= "2014-10-31" ) %>%
  mutate(fase = "2_Coalescence")

fase3 <- raw_jod %>% 
  subset(date >= "2014-11-01" & date <= "2015-10-31" ) %>%
  mutate(fase = "3_Bureaucratization")

fase4 <- raw_jod %>% 
  subset(date >= "2015-11-01" & date <= "2017-08-31" ) %>%
  mutate(fase = "4_Decline")

raw_jod <- bind_rows(fase1, fase2, fase3, fase4)

Catatan: Ada satu row yang hilang, padahal parameter tanggal sudah sesuai dengan rentang waktu. Kemungkinannya, ada salah satu row di kolom date yang kosong. Untuk selanjutnya, jumlah twit yang akan dianalisis sebanya 13492.

2.4 Username

Script berikut ini membuat dua buah kolom yang berisi daftar username yang diambil dari kolom username dan tweets. Kolom lainnya merupakan jumlah username per baris yang menunjukkan jumlah username yang terlibat dalam sebuah twit.

# menambah @ pada kolom username
raw_jod$username <- paste("@", raw_jod$username, sep="")

# menggabungkan kolom username dengan tweet
raw_jod$user_all <- paste(raw_jod$username, raw_jod$tweets, sep=" ")

# mengekstrak username dari kolom hasil gabungan di atas 
raw_jod$user_all <- sapply(str_extract_all(raw_jod$user_all, "@\\S+", simplify = FALSE), paste, collapse=" ")

# merenggangkan tanda : setelah username 
raw_jod$user_all <- gsub(":", " \\1 ", raw_jod$user_all, perl=T)

raw_jod$user_count <- sapply(raw_jod$user_all, function(x) length(unlist(strsplit(as.character(x), "@\\S+"))))

2.5 Tweets cleaning

Script berikut ini digunakan untuk membuat kolom twit yang sudah dibersihkan dari:

  1. Username
  2. Tagar
  3. Urls
  4. Stopwords bahasa Indonesia
  5. Term yang dipilih untuk dihilangkan, yaitu term yang tidak dapat diartikan atau kurang relevan dalam upaya mejawab pertanyaan penelitian.

Selain itu, script di bawah ini juga membuat kolom baru yang berisi jumlah term per kolom. Kolom baru ini selanjutnya akan digunakan sebagai parameter utama untuk membuat data input untuk lDA.

Menjalankan fungsi cleaner pada kolom tweets

jod_clean <- tweet_cleaner(raw_jod$tweets)
jod_clean$word_count <- sapply(jod_clean$clean_text, function(x) length(unlist(strsplit(as.character(x), "\\W+"))))

Menggabungkan hasil cleaning dengan data awal

raw_jod <- bind_cols(raw_jod, jod_clean)
# zzzzzz clean environment
rm(jod_clean)

2.6 Hashtag per row

# mengekstrak username dari kolom hasil gabungan di atas 
raw_jod$hashtag <- sapply(str_extract_all(raw_jod$tweets, "#\\S+", simplify = FALSE), paste, collapse=" ")

# merenggangkan tanda : setelah username 
#raw_jod$user_all <- gsub(":", " \\1 ", raw_jod$user_all, perl=T)

raw_jod$tag_count <- sapply(raw_jod$hashtag, function(x) length(unlist(strsplit(as.character(x), "@\\S+"))))

3 Analisis

Untuk mendapatkan tilikan, saya coba petakan terlebih dahulu tagar-tagar yang digunakan dalam twit dan melihat 10 tagar dengan frekuensi tertinggi berkembang dalam setiap fase gerakan.

tagar

tagar <- raw_jod %>%
  group_by(fase) %>%
  unnest_tokens(hashtag, hashtag, to_lower = FALSE) %>%
  count(hashtag, sort = TRUE) %>%
  arrange(desc(n)) %>%
  ungroup()

# viz
tagar %>%
  arrange(desc(n)) %>%
  top_n(20) %>%
  ggplot(aes(x = reorder(hashtag, n), y = n, fill = factor(fase))) +
  geom_col(show.legend = FALSE) +
  coord_flip() +
  facet_wrap(~fase) +
  labs(x = "Tagar", 
       y = "Frekuensi")
Figure 1: Tagar paling sering digunakan

Figure 1: Tagar paling sering digunakan

  1. Pada fase pertama, pada prinsipnya hanya satu tagar yang paling sering digunakan, yaitu tagar #jogjaoradidol.
  2. Pada fase kedua, hal yang dibicarakan oleh warga net dalam twit dengan tagar #jogjaoradidol mulai berkembang. Hal ini ditandai dengan munculya tagar #balitolakreklamasi, #jogja, dan 10thjhf. Tiga tagar tersebut mengindikasikan mulai berkembangnya pembahasan tentang isu utama dibalik tagar #jogjaoradidol. Pertanyaan: apakah ini proses pelembagaan publik dalam bentuk discourse?
  3. Pada fase ketiga, lebih berkembang lagi, ada tagr jogjasat, dan selman ambyar yang merupakan representasi lain dari dibalik tagar utama. 2 tagar tersebut menunjukkan isu yang lebih spesifik, JogjaAsat tentang air, dan sleman tentang daerah Sleman.
  4. Pada fase keempat, mengercut dari segi keberagaman, dan menurun dari segi jumlah. Pertanyaan: apakah gerakan ini sudah sukses? namun satu hal yang pasti, pembagian fase yang saya lakukan sepertinya tidak terlalu meleset.

user all Pertanyaan: Apakah aktornya juga berkembang?

user_terlibat <- raw_jod %>%
  group_by(fase) %>%
  unnest_tokens(user_all, user_all, to_lower = FALSE) %>%
  count(user_all, sort = TRUE) %>%
  arrange(desc(n)) %>%
  ungroup()
# viz
user_terlibat %>%
  arrange(desc(n)) %>%
  top_n(10) %>%
  ggplot(aes(x = reorder(user_all, n), y = n, fill = factor(fase))) +
  geom_col(show.legend = FALSE) +
  coord_flip() +
  facet_wrap(~fase) +
  labs(x = "Username", 
       y = "Frekuensi")
Figure 2: Username yang paling sering ada dalam twit

Figure 2: Username yang paling sering ada dalam twit

Aktor yang dalam konteks ini direpresentasikan oleh username juga mengalami “perkembangan”. Di mana pada fase awal, tagar lebih sering digunakan oleh username @JogjaOraDidol, dan @JRX_SID lalu pada fase kedua oleh @rembugjogja dan @kilthedj. Pada fase ketiga oleh @dodoputrabangsa dan @joeyakarta. Hal ini menunjukkan bahwa tagar cenderung merepresentasikan sebuah tempat, dimana setiap orang bisa ada didalamnya. Ia tidak terikat hanya dengan salah satu aktor atau pengerak. Hal tersebut dibuktikan dengan adanya perbuahan username.

3.1 Konteks dan setting munculnya isu

Idealnya ini bisa dipetakan setelah partisipasi warga net diketahui. Tapi untuk kebutuhan laporan, mari lakukan saja dengan sistematika seperti ini.

3.2 Partisipasi Pengguna Tagar

  1. Distribusi twit
  2. Distribusi user
  3. Distribusi fav, ret, dan fav
partisipasi <- raw_jod[,c("date", "fav_count", "rep_count", "ret_count", "user_count")]
df1 <- partisipasi %>%
  count(date)
df2 <- partisipasi %>% 
  group_by(date) %>% 
  summarise_all(sum)

jod_dist <- as.data.frame(bind_cols(df1, df2))
jod_dist <- jod_dist %>%
  select(date, fav_count, rep_count, ret_count, user_count, tweet_count = n)

Menyimpan data tentang partisipasi

write.csv(jod_dist, "partisipasi_jod.csv")

partisipasi per bulan

per_month <- jod_dist %>% 
  group_by(bulan=floor_date(date, "month")) %>%
   summarize(freq_bulan=sum(tweet_count))
per_month$bulan = factor(months(per_month$bulan), levels = c('January','February','March','April','May','June','July','August','September','October','November','December'))

per_month %>%
  ggplot(aes(x = bulan, y = freq_bulan)) + 
  geom_col(show.legend = FALSE) +
  labs(x = NULL, 
       y = NULL)

plot partisipasi all

# melt the data for ggplot using `reshape2`
jod_dist <- melt(jod_dist, id = "date")

# ploting to goem_line ggplot2
ggplot(data=jod_dist, aes(x=date, y=value, colour=variable)) +
  geom_line(show.legend = FALSE) +
  scale_x_date(labels = date_format("%Y-%m"), 
               breaks = date_breaks("6 months")) +
  facet_grid(variable~., scales="free") +
  theme(legend.position="top")
Figure 3: Distribusi twit, user dan aktvitas pengguna tagar

Figure 3: Distribusi twit, user dan aktvitas pengguna tagar

Apa itu? itu adalah distribusi pengguna, twit, dan aktivitas lainnya selama 1081 hari dari 07-10-2010 sampai 30-08-2017. Jika mengacu pada pembagian periode, di mana data dibagi menjadi empat, maka orang lebih banyak menggunakan tagar pada fase Emergence (mulai 2013-10-07) hingga fase Bureaucratization (berakhir pada 2014-12-31). Setelah itu, partisipasi warga net dalam penggunaan tagar mengalami penurunan.

Hal apa saja yang melatari partisipasi seperti yang ditunjukkan plot di atas? atau ada saja dibali distribusi di atas?

Untuk mendapatkan tilikan dan jawaban pertanyaan di atas, saya mengambil twit dari tanggal-tanggal, di mana orang cenderung lebih sering menggunakan tagar. Di sini, tangal tersebut diambil berdasarkan frekuensi twit yang menjadi anomali dalam setiap fase.

Anomali all

#df1
df1$date <- as.POSIXct(df1$date, format = "%Y-%m-%d")

anomali_all = AnomalyDetectionTs(df1, max_anoms=0.02, direction='both', plot=TRUE)

anomali_all$plot
Figure 4: Anomali penggunaan tagar dari tahun 2013-2017

Figure 4: Anomali penggunaan tagar dari tahun 2013-2017

Secara keseluruhan, anomali terjadi pada:

  1. 2013-10-09 dengan frekuensi 350
  2. 2013-10-10 dengan frekuensi 895
  3. 2013-10-11 dengan frekuensi 548
  4. 2013-10-12 dengan frekuensi 528
  5. 2013-10-13 dengan frekuensi 348
  6. 2013-10-14 dengan frekuensi 329
  7. 2013-10-15 dengan frekuensi 241
  8. 2013-10-16 dengan frekuensi 137
  9. 2013-10-17 dengan frekuensi 150
  10. 2013-10-20 dengan frekuensi 134
  11. 2013-11-15 dengan frekuensi 162
  12. 2014-06-20 dengan frekuensi 193
  13. 2014-09-05 dengan frekuensi 159
  14. 2014-09-07 dengan frekuensi 247
  15. 2014-09-08 dengan frekuensi 188
  16. 2014-09-19 dengan frekuensi 167
  17. 2014-09-22 dengan frekuensi 169
  18. 2014-10-07 dengan frekuensi 403
  19. 2014-11-06 dengan frekuensi 225
  20. 2014-12-28 dengan frekuensi 223
  21. 2014-12-29 dengan frekuensi 308

Rerata twit secara umum = 12 twit per hari

3.2.1 Fase 1 - Emergency

Fase Emergence berasal dari twit yang diunggah dari 2013-10-07 sampai 2013-12-31

fase1_dist <- raw_jod %>%
  filter(fase == "1_Emergence") %>%
  select(date) %>%
  group_by(date) %>%
  count(date)

ggplot(fase1_dist, aes(x = date, y = n)) + 
  geom_line() + 
  geom_smooth() +
  labs(x = NULL, 
       y = NULL)

fase1_dist %>%
  filter(n > 58) %>%
  dplyr::arrange(desc(date)) %>%
  ggplot(aes(x = as.character(date), y = n)) + 
  geom_col(show.legend = FALSE) +
  coord_flip() +
  labs(x = NULL, 
       y = NULL)
Figure 5: Distribusi twit dan tanggal dengan frekuensi diatas rerata pada fase EmergenceFigure 5: Distribusi twit dan tanggal dengan frekuensi diatas rerata pada fase Emergence

Figure 5: Distribusi twit dan tanggal dengan frekuensi diatas rerata pada fase Emergence

Rerata per hari = 58

Terdapat 14 hari di mana tagar pada fase 1 lebih sering digunakan. 13 hari diantaranya berasal secara berutan dari tanggal 09 oktober 2013 hingga 21 oktober 2013. Sementara satu tanggal lainya dari tanggal 15 November 2013.

Anomali Detection Fase 1

fase1_dist$date <- as.POSIXct(fase1_dist$date)
fase1_anomali = AnomalyDetectionTs(fase1_dist, max_anoms=0.02, direction='both', plot=TRUE)
fase1_anomali$plot
Figure 6: Anomali penggunaan tagar pada fase 1

Figure 6: Anomali penggunaan tagar pada fase 1

Terjadi anomali pada tanggal 2013-10-10 dengan frekuensi 895

3.2.2 Fase 2 - Coalescence

Fase Coalescence berasal dari twit yang diunggah dari 2014-01-01 sampai 2014-06-30

fase2_dist <- raw_jod %>%
  filter(fase == "2_Coalescence") %>%
  select(date) %>%
  group_by(date) %>%
  count(date)

ggplot(fase2_dist, aes(x = date, y = n)) + 
  geom_line() + 
  geom_smooth() +
  labs(x = NULL, 
       y = NULL)

fase2_dist %>%
  filter(n >= 188) %>%
  dplyr::arrange(desc(date)) %>%
  ggplot(aes(x = as.character(date), y = n)) + 
  geom_col(show.legend = FALSE) +
  coord_flip() +
  labs(x = NULL, 
       y = NULL)
Figure 7: Distribusi twit dan tanggal dengan frekuensi diatas rerata pada fase CoalescenceFigure 7: Distribusi twit dan tanggal dengan frekuensi diatas rerata pada fase Coalescence

Figure 7: Distribusi twit dan tanggal dengan frekuensi diatas rerata pada fase Coalescence

Rerata per hari = 15

Anomali Detection Fase 2

fase2_dist$date <- as.POSIXct(fase2_dist$date)
fase2_anomali = AnomalyDetectionTs(fase2_dist, max_anoms=0.02, direction='both', plot=TRUE)
fase2_anomali$plot
Figure 8: Anomali penggunaan tagar pada fase 2

Figure 8: Anomali penggunaan tagar pada fase 2

Terjadi anomali frekuensi pada:

  1. 2014-06-20 dengan 193
  2. 2014-09-07 dengan 247
  3. 2014-09-08 dengan 188
  4. 2014-10-07 dengan 403

3.2.3 Fase 3 - Bureaucratization

Periode ini berasal dari twit yang diunggah dari 2014-07-01 sampai 2014-12-31

fase3_dist <- raw_jod %>%
  filter(fase == "3_Bureaucratization") %>%
  select(date) %>%
  group_by(date) %>%
  count(date)

ggplot(fase3_dist, aes(x = date, y = n)) + 
  geom_line() + 
  geom_smooth() +
  labs(x = NULL, 
       y = NULL)

fase3_dist %>%
  filter(n >= 98) %>%
  dplyr::arrange(desc(date)) %>%
  ggplot(aes(x = as.character(date), y = n)) + 
  geom_col(show.legend = FALSE) +
  coord_flip() +
  labs(x = NULL, 
       y = NULL)
Figure 9: Distribusi twit dan tanggal dengan frekuensi diatas rerata pada fase CoalescenceFigure 9: Distribusi twit dan tanggal dengan frekuensi diatas rerata pada fase Coalescence

Figure 9: Distribusi twit dan tanggal dengan frekuensi diatas rerata pada fase Coalescence

Rerata per hari = 12

Anomali Detection Fase 3

fase3_dist$date <- as.POSIXct(fase3_dist$date)
fase3_anomali = AnomalyDetectionTs(fase3_dist, max_anoms=0.02, direction='both', plot=TRUE)
fase3_anomali$plot
Figure 10: Anomali penggunaan tagar pada fase 3

Figure 10: Anomali penggunaan tagar pada fase 3

Anomali frekuensi twit terjadi pada:

  1. 2014-11-06 dengan jumlah 225 twit
  2. 2014-11-07 dengan jumlah 102 twit
  3. 2014-12-28 dengan jumlah 223 twit
  4. 2014-12-29 dengan jumlah 308 twit
  5. 2015-04-01 dengan jumlah 98 twit
  6. 2015-10-06 dengan jumlah 109 twit

3.2.4 Fase 4 - Decline

Periode ini berasal dari twit yang diunggah dari 2015-01-01 sampai 2017-08-30

fase4_dist <- raw_jod %>%
  filter(fase == "4_Decline") %>%
  select(date) %>%
  group_by(date) %>%
  count(date)

ggplot(fase4_dist, aes(x = date, y = n)) + 
  geom_line() + 
  geom_smooth() +
  labs(x = NULL, 
       y = NULL)

fase4_dist %>%
  filter(n >= 14) %>%
  dplyr::arrange(desc(date)) %>%
  ggplot(aes(x = as.character(date), y = n)) + 
  geom_col(show.legend = FALSE) +
  coord_flip() +
  labs(x = NULL, 
       y = NULL)
Figure 11: Distribusi twit dan tanggal dengan frekuensi diatas rerata pada fase CoalescenceFigure 11: Distribusi twit dan tanggal dengan frekuensi diatas rerata pada fase Coalescence

Figure 11: Distribusi twit dan tanggal dengan frekuensi diatas rerata pada fase Coalescence

Rerata per hari = 2

Anomali Detection Fase 21

fase4_dist$date <- as.POSIXct(fase4_dist$date, format = "%Y-%m-%d")

fase4_anomali = AnomalyDetectionTs(fase4_dist, max_anoms=0.02, direction='both', plot=TRUE)

fase4_anomali$plot
Figure 12: Anomali penggunaan tagar pada fase 4

Figure 12: Anomali penggunaan tagar pada fase 4

Terjadi anomali frekuensi twit pada:

  1. 2015-11-10 dengan jumlah 18
  2. 2015-11-26 dengan jumlah 15
  3. 2015-12-26 dengan jumlah 14
  4. 2016-02-16 dengan jumlah 16
  5. 2016-03-16 dengan jumlah 14
  6. 2016-04-30 dengan jumlah 19
  7. 2016-05-06 dengan jumlah 19
  8. 2016-05-07 dengan jumlah 17
  9. 2016-10-06 dengan jumlah 23

3.3 Pembentukan opini publik: Tagar sebagai tempat diskusi

4 Simpulan

 

A work by Ujang Fahmi

eppofahmi@gmail.com